package pe.edu.upc.dsd.epica.serviceimp;

import java.util.List;
import javax.jws.WebService;
import javax.ws.rs.PathParam;
import javax.xml.soap.SOAPException;

import org.apache.log4j.Logger;

import pe.edu.upc.dsd.epica.dao.PromocionDao;
import pe.edu.upc.dsd.epica.model.ListaPromocion;
import pe.edu.upc.dsd.epica.model.Promocion;
import pe.edu.upc.dsd.epica.service.PromocionService;

@WebService (endpointInterface = "pe.edu.upc.dsd.epica.service.PromocionService")
public class PromocionServiceImpl implements PromocionService {

	PromocionDao promocionDao;
	private final static Logger logger = Logger.getLogger(PromocionServiceImpl.class);

	public void setPromocionDao(PromocionDao promocionDao) {
		this.promocionDao = promocionDao;
	}

	@Override
	public ListaPromocion findByEstablecimientoCode(String codigo) throws SOAPException {
		try {
			List<Promocion> listaArray = promocionDao.findByEstablecimientoCode(codigo);
			
			ListaPromocion listaPromo = new ListaPromocion();
			listaPromo.setListaPromociones(listaArray);
			
			return listaPromo;
		} catch (Exception e) {
			logger.error("Titulo:\nBuscar Promocion [PromocionService].\nMensaje:\n"+e.getMessage());
			throw new SOAPException("Error al buscar la promocion.");
		}		
	}
		
	//Criterio de aceptacion
	@Override
	public void save(@PathParam("Promo")Promocion promo) throws SOAPException {
		ValidatePromocion(promo);
		
		if (promo.getNombre() == null || promo.getDescripcion() == null || 
				promo.getFecVencimiento() == null || promo.getEstablecimiento() == null) 
		{
			throw new IllegalArgumentException("No debe ingresar valores nulos.");
		}			
		
		if(promo.getNumVisitas() <= 0 || promo.getNumVisitas() > 5)
		{
			throw new IllegalArgumentException("El numero de visitas debe ser >= 1 y <= 5.");
		}
		
		if(promo.getPorDescto() < 25 || promo.getPorDescto() > 100){
			throw new IllegalArgumentException("El porcentaje de descuento debe ser >= 25% y <= 100 %");
		}
				
		promo.setCodigo("P" + String.valueOf(promocionDao.getConteoPromocion() + 1));
		
		try {
			promocionDao.save(promo);
		} catch (Exception e) {
			logger.error("Titulo:\nGuardar Promocion [PromocionService].\nMensaje:\n"+e.getMessage());
			throw new SOAPException("Error al guardar la promocion.");
		}
		
		
	}

	@Override
	public void update(String codPromocion,Promocion promo) throws SOAPException {
		ValidatePromocion(promo);
		try {
			promocionDao.update(promo);
		} catch (Exception e) {
			logger.error("Titulo:\nActualizar Promocion [PromocionService].\nMensaje:\n"+e.getMessage());
			throw new SOAPException("Error al actualizar la promocion.");
		}				
	}

	@Override
    public Promocion findByPromocionCode(String codigo) throws SOAPException {
		try {
			return promocionDao.findByPromocionCode(codigo);
		} catch (Exception e) {
			logger.error("Titulo:\nBuscar Promocion por codigo [PromocionService].\nMensaje:\n"+e.getMessage());
			throw new SOAPException("Error al buscar la promocion.");
		}
		
	}

	@Override
	public void delete(String codigo) throws SOAPException {
		try {
			promocionDao.delete(codigo);
		} catch (Exception e) {
			logger.error("Titulo:\nEliminar Promocion por codigo [PromocionService].\nMensaje:\n"+e.getMessage());
			throw new SOAPException("Error al eliminar la promocion.");
		}				
	}
	
	private void ValidatePromocion(Promocion promo)
	{
		if(promo == null)
		{
			throw new IllegalArgumentException("El objeto promocion no puede ser nulo.");
		}
	}

}

